package partyBrookerHameln;
/**
 * Die Klasse Gegenstand (in Kommentaren und Variablennamen häufig Objekt
 * genannt) besteht im Wesentlichen nur aus Get- und Set-methoden der
 * vorhandenen Attribute und Methoden zur Ausgabe bzw. zur überprüfung von
 * Verleihbarkeit und Verkäuflichkeit. Es wird vermehrt mit Objekten der Klasse
 * Gegenstand operiert, als das diese Klasse selber Operationen ausführt. Es
 * wird nicht nach Verkaufs- bzw. Verleih-Gegenständen abstrahiert, da diese
 * Klasse das intern anhand der Methoden verleihbar() und verkaeuflich() löst.
 * Außerdem kann ein Gegenstand ein Service sein (siehe Boolean service), wenn
 * weder Verkaufspreis, noch Leihgebühr einen Wert enthalten, dafür aber eine
 * Handlingpauschale vorhanden ist. Ein Service hat einen konstanten Bestand von
 * 1.
 *
 */
public class Gegenstand {

	private String name;
	private double verkaufsPreis;
	private double leihGebuehr;
	private double handlingPauschale;
	private double wertersatzVerlust;
	private int bestand;
	private boolean service;

	/**
	 * Der Konstruktor der Klasse Gegenstand. Hier werden die benötigten
	 * Parameter übergeben und geprüft, ob es sich bei dem Gegenstand um einen
	 * Service handelt.
	 * 
	 * @param name
	 *            Einzigartiger Objektname.
	 * @param verkaufsPreis
	 *            Einmaliger Verkaufspreis
	 * @param leihGebuehr
	 *            Leihgebühr pro Tag
	 * @param handlingPauschale
	 *            Einmalige Kosten zur Wartung, Reinigung, etc.
	 * @param wertersatzVerlust
	 *            Kosten bei Verlust des Objekts
	 * @param bestand
	 *            Anzahl der aufzunehmenden Objekte
	 */
	public Gegenstand(String name, double verkaufsPreis, double leihGebuehr, double handlingPauschale, double wertersatzVerlust, int bestand) {
		this.setName(name);
		this.setVerkaufsPreis(verkaufsPreis);
		this.setLeihGebuehr(leihGebuehr);
		this.setHandlingPauschale(handlingPauschale);
		this.setWertersatzVerlust(wertersatzVerlust);
		this.setBestand(bestand);
		this.service = false;

		if ((verkaufsPreis == 0 & leihGebuehr == 0)) {
			if (handlingPauschale != 0) {
				this.service = true;
				this.bestand = 1;
			}

		}

	}

	/**
	 * Gibt einen Boolean zurück. Wenn das Objekt eine Leihgebühr hat, ist es
	 * verleihbar.
	 * 
	 * @return boolean true, wenn das Objekt verleihbar ist
	 */
	public boolean verleihbar() {
		boolean leihbar = false;

		if (leihGebuehr > 0) {
			leihbar = true;
		}
		return leihbar;
	}

	/**
	 * Gibt einen Boolean zurück. Wenn das Objekt einen Verkaufspreis hat, oder
	 * ein Service ist, ist es verkäuflich.
	 * 
	 * @return boolean true, wenn das Objekt verkäuflich ist
	 */
	public boolean verkaeuflich() {
		boolean kaufbar = false;

		if (verkaufsPreis > 0 | service) {
			kaufbar = true;
		}
		return kaufbar;
	}

	/**
	 * Gibt den Namen des Objekts als Zeichenkette zurück.
	 * 
	 * @return String Der Name des Objekts
	 */
	public String getName() {
		return name;
	}

	/**
	 * Setzt den übergebenen Namen als aktuelle Objektnamen.
	 * 
	 * @param name
	 *            Der neue Objektname
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * Gibt den Verkaufspreis als double zurück
	 * 
	 * @return double Der Verkaufspreis des Objekts
	 */
	public double getVerkaufsPreis() {
		return verkaufsPreis;
	}

	/**
	 * Setzt den übergebenen double als Verkaufspreis
	 * 
	 * @param verkaufsPreis
	 *            Der neue Verkaufspreis
	 */
	public void setVerkaufsPreis(double verkaufsPreis) {
		this.verkaufsPreis = verkaufsPreis;
	}

	/**
	 * Gibt die Leigebühr als double zurück
	 * 
	 * @return leihGebuehr
	 */
	public double getLeihGebuehr() {
		return leihGebuehr;
	}

	/**
	 * Setzt den übergebenen double als Leihgebühr
	 * 
	 * @param leihGebuehr
	 *            Die neue Leihgebühr
	 */
	public void setLeihGebuehr(double leihGebuehr) {
		this.leihGebuehr = leihGebuehr;
	}

	/**
	 * Gibt die Handlingpauschale als double zurück
	 * 
	 * @return handlingpauschale
	 */
	public double getHandlingPauschale() {
		return handlingPauschale;
	}

	/**
	 * Setzt den übergebenen double als Handlingpauschale
	 * 
	 * @param handlingPauschale
	 *            Die neue Handlingpauschale
	 */
	public void setHandlingPauschale(double handlingPauschale) {
		this.handlingPauschale = handlingPauschale;
	}

	/**
	 * Gibt einen boolean zurück, ob der Gegenstand ein Service ist
	 * 
	 * @return service
	 */
	public boolean getService() {
		return service;
	}

	/**
	 * Gibt den Wertersatz bei Verlust des Objekts als double zurück
	 * 
	 * @return wertesatz
	 */
	public double getWertersatzVerlust() {
		return wertersatzVerlust;
	}

	/**
	 * Setzt den übergebenen double als Wertersatz
	 * 
	 * @param wertersatzVerlust
	 *            Der neue Wertersatz, der bei Verlust fällig wird
	 */
	public void setWertersatzVerlust(double wertersatzVerlust) {
		this.wertersatzVerlust = wertersatzVerlust;
	}

	/**
	 * Gibt den Bestand des Gegenstands als int zurück
	 * 
	 * @return bestand
	 */
	public int getBestand() {
		return bestand;
	}

	/**
	 * Setzt den übergebenen int als bestand
	 * 
	 * @param bestand
	 *            Der neue Bestand des Gegenstands
	 */
	public void setBestand(int bestand) {
		this.bestand = bestand;
	}

	/**
	 * Verringert den Bestand dieses Gegenstandes um die übergebene Anzahl
	 * 
	 * @param anzahl
	 *            Der Subtrahend um den Bestand verringert werden soll
	 */
	public void bestandVerringern(int anzahl) {
		bestand = bestand - anzahl;
	}

	/**
	 * Die Methode stellt eine Zeichenkette auf eine bestimmte Länge ein, indem
	 * sie mit vorangestellten Leerzeichen aufgefüllt wird.
	 * 
	 * @param st
	 *            Der zu formatierende String
	 * @param len
	 *            Die Länge des auszugebenen String
	 * @return String Eine mit führenden Leerzeichen verlängerte Zeichenkette
	 */
	public String formatBlanks(String st, int len) {
		String result = String.valueOf(st);
		while (result.length() < len) {
			result = " " + result;
		}
		return result;
	}

	/*
	 * Ausgabezeile für Tabellenausgabe
	 * 
	 * @return String der Tabellenzeile
	 */
	public String toString() {
		return "║" + formatBlanks(name, 35) + "║" + formatBlanks(String.valueOf(bestand), 7) + "║" + formatBlanks(String.valueOf(this.verkaufsPreis), 11) + "€ ║"
				+ formatBlanks(String.valueOf(this.leihGebuehr), 8) + "€ ║" + formatBlanks(String.valueOf(this.handlingPauschale), 15) + "€ ║"
				+ formatBlanks(String.valueOf(this.wertersatzVerlust), 8) + "€ ║";
	}

	/**
	 * Ausgabezeile für Tabellenausgabe von Leihgegenständen
	 * 
	 * @return String der Tabellenzeile
	 */
	public String toStringLeih() {
		return "║" + formatBlanks(name, 35) + "║" + formatBlanks(String.valueOf(bestand), 7) + "║" + formatBlanks(String.valueOf(this.leihGebuehr), 8) + "€ ║"
				+ formatBlanks(String.valueOf(this.handlingPauschale), 15) + "€ ║" + formatBlanks(String.valueOf(this.wertersatzVerlust), 8) + "€ ║";
	}

	/**
	 * Ausgabezeile für Tabellenausgabe von Verkaufsgegenständen
	 * 
	 * @return String der Tabellenzeile
	 */
	public String toStringKauf() {
		return "║" + formatBlanks(name, 35) + "║" + formatBlanks(String.valueOf(bestand), 7) + "║"
				+ formatBlanks(service ? String.valueOf(this.handlingPauschale) : String.valueOf(this.verkaufsPreis), 11) + "€ ║";
	}
}
